﻿// See https://aka.ms/new-console-template for more information
using DecoratorPattern;
using DecoratorPattern.DecoratorClass;

//Console.WriteLine("Hello, World!");

/** Decorator Pattern Example
* 1 装饰器模式
* 2 通过装饰器模式，可以在不修改现有代码的情况下，动态地添加新的功能或行为。
* 3 这种模式通常用于需要在运行时添加或修改对象的行为的场景。
*
* 《AOP面向切面编程》是装饰器模式的一个应用场景。
*  OOP--> AOP 面向对象编程 --> 面向切面编程
*  OOP 是面向对象编程的缩写，强调对象和类的概念。
*  AOP 是面向切面编程的缩写，强调在程序中分离关注点，特别是横切关注点（如日志、安全、事务等）的处理。
*  
*  现在有新需求，学习的学生要获取视频+笔记+学习资料
*  需求进一步改进希望增加更多功能，作业巩固、考试测试等、老师答疑、课前预习、课后复习等
*  要求个数、顺序都可用灵活定制，而且不破坏封装。
*/

{
    //Console.WriteLine("*******************************************************");
    //// 创建一个免费学生对象
    //AbstructStudent studentFree = new StudentFree { Id = 1, Name = "张三" };
    //studentFree.Study();
    //studentFree.Show();
    //// 创建一个VIP学生对象
    //Console.WriteLine("*******************************************************");
    //AbstructStudent studentVip = new StudentVip { Id = 2, Name = "李四" };
    //studentVip.Study();
    //studentVip.Show();

    //// 如果有功能扩展，OOP就不能满足需求了，能不能在不修改现有代码的情况下，动态地添加新的功能或行为呢？当然可以，这就是装饰器模式的应用场景。
    //Console.WriteLine("*******************************************************");
    //StudentFreeVideo studentFreeVideo = new StudentFreeVideo { Id = 3, Name = "王五" };
    //studentFreeVideo.Study();
    //studentFreeVideo.Show();
    //Console.WriteLine("*******************************************************");
    //StudentCombination studentCombination = new StudentCombination(studentFree);
    //studentCombination.Study();
    //studentCombination.Show();
}

{
    // 使用装饰器模式
    //Console.WriteLine("*******************************************************");
    AbstructStudent student = new StudentFree { Id = 1, Name = "张三" };
    //studentFree.Study();
    student.Show();

    // 使用装饰器模式
    Console.WriteLine("*******************************************************");
    //BaseDecorator decorator = new BaseDecorator(studentFree);
    //decorator.Study();

    /**
     * 装饰器模式的实现
     * 装饰器就是AOP 和 MVC的Filter类似
     */
    //AbstructStudent student = new BaseDecorator(studentFree);
    //student = new BaseDecorator(student);
    student = new StudentDecoratorHomework(student);
    student = new StudentDecoratorVideo(student);
    student = new StudentDecoratorAnswer(student);

    student = new StudentDecoratorPreview(student);
    student = new StudentDecoratorReview(student);
    student = new StudentDecoratorTest(student);
    
    student.Show();
    student.Study();
}
